home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MACD 5
/
MACD 5.bin
/
workbench
/
tools
/
czesc_1
/
bangermenu
/
bangermenu.asm
< prev
next >
Wrap
Assembly Source File
|
1984-08-28
|
77KB
|
1,938 lines
;Programm: BangerMenu bietet eine grafische Oberfläche zum Anwählen von Programmen
; die beim Starten in der Startup-Sequence aufgerufen werden sollen.
;Autor : Andre´ Trettin
;Codename: Banger
;Begin : 31-Mai-95 17:08:28
;$VER : BangerMenu.Asm 3.3 (4-Sep-96)
** INCLUDE Struktur Variablen
* Fehler Codes: 21=kein Speicher
* 22=konnte Library (oder Libraries) nicht öffnen
* 23=GetVisualInfo Fehler
* 24=konnte File S:BangerMenu.Prefs nicht öffnen
* 25=bei der Gadgeterschaffung trat ein Fehler auf
* 26=konnte Fenster nicht öffnen oder Task nicht Finden
* 27=Einstellungen sind Leer
* 28=kein Speicher für die Einstellungen
* 29=kein MsgPort
* 30=konnte kein IORequest create
* 31=konnte Device nicht öffnen
* 32=falsche Parameter angabe
* 33=zu viele Gadget (>2560)
* 34=konnte MonitorTreiber Datei nicht laden
* 35=Monitor mit angebenen ID nicht gefunden
* 36=konnte Screen nicht öffnen
* 37=Fehler im Einstellungsfile
* 38=Menu Fehler
* 10=Return Code für die Startup-Sequence
incdir INCLUDE:
include exec/exec.i
include exec/io.i
include devices/input.i
include devices/inputevent.i
include dos/dos.i
include dos/dosextens.i
include dos/dostags.i
include intuition/intuition.i
include libraries/gadtools.i
include lvo/exec_lib.i
include lvo/dos_lib.i
include lvo/intuition_lib.i
include lvo/gadtools_lib.i
include lvo/graphics_lib.i
include lvo/input_lib.i
STRUCTURE BangerMenu,0
APTR BaM_MenuTitleText
APTR BaM_MenuKey
STRUCT BaM_SpaltenTitleText,[50*4]
STRUCT BaM_SpaltenLaenge,[50]
STRUCT BaM_GadgetLaenge,[50]
BYTE BaM_SpaltenAnzahl
BYTE BaM_SeitenAnzahl
WORD BaM_GadgetAnzahl
LABEL BaM_SIZEOF
STRUCTURE Internal,0
APTR INTUIBase ;Intuition Lib. Addr.
APTR DOSBase ;Dos Lib. Addr.
APTR GADBase ;GadTools Lib. Addr.
APTR GFXBase ;Graphics Lib. Addr.
APTR WindowHandle ;Fenster Addr.
APTR ScreenHandle ;ScreenAddr.
APTR VisualInfo ;VisualInfo Addr.
APTR WinRPort ;Window RasrPort Addr.
APTR PrefsFileHandle ;File Addr.
APTR FileSpeicher ;File Speicher
APTR FontAddr ;TextAttr-Struktur
APTR meinTask ;Task Addr.
APTR alterTask ;alter Task Addr.
APTR AnGad ;Angewählte Gadget Addr.
APTR MsgPortAddr ;Addr. des Message Port
APTR PrefsLoadKey ;Para: PrefsFilename
APTR MonitorKey ;Para: MonitorTreiber
APTR MoniID ;Para: MonitorID Nr.
APTR NOKEYArray ;Para: NOKEY
APTR RDArgs ;Resultat von ReadArgs/dos
APTR MenuPtr ;Menu Addr
APTR PrintMarkTab ;Text Marker für die Seiten beim erstellen
APTR ProgrammDir ;aktuelles Verzeichnis des Auszuführenden Prog.
APTR AltesDir ;altes Verzeichnis
STRUCT FIB,[fib_SIZEOF] ;FIB=FileInfoBlock Struktur
STRUCT TastenIBlock,[IO_SIZE] ;Addr. IORequest
STRUCT MenuData,[BaM_SIZEOF*50] ;Daten des BangerMenu aufbau
STRUCT PrintData,[it_SIZEOF*20] ;IntuiText Struktur für die Textausgabe der SpaltenTitle
STRUCT VirtualMenu,[gnm_SIZEOF*55] ;unabhängiges ScreenMenu
STRUCT GadgetAddr,[2600*4] ;Alle GadgetsAddressen max 2600
STRUCT GadgetListe,[11*4] ;Einzelnen GadgetListe (Window)
STRUCT PageLAddr,[11*4] ;eine Seite zurück
STRUCT PageRAddr,[11*4] ;eine Seite vor
STRUCT GadgetPage,[11*4] ;Gadgetanfang einer Seite
STRUCT PrintPage,[11*4] ;PrintIText Addr
LONG Filegroesse ;Filegröße
WORD HoeheWin ;Fenster Höhe
WORD BreiteWin ;Fenster Breite
WORD AlteHoeheWin ;Alte Fenster Höhe
WORD AlteBreiteWin ;Alte Fenster Breite
WORD SCHoehe ;Screen Höhe
WORD SCBreite ;Screen Breite
WORD AnPage ;Momentaniges Angewählte Seite
WORD MaxSpaltenZahl ;Max. Anzahl in einer Spalte
WORD JetztigeSeite ;GadgetAnzahl der jetzigen Seite
WORD VorigeSeitenLaenge ;Vorige Seiten GadgetAnzahl
WORD LetzteSPLaenge ;Letzte Spalten Länge
WORD ErsteSPLaenge ;ErsteSpaltenLänge
WORD VorigeSPLaenge ;VorigeSpaltenLänge
WORD JetztigeSPLaenge ;JetzigeSpaltenLänge
WORD NaechsteSPLaenge ;NächsteSpaltenLänge
WORD RelativeGDPos ;GadgetPostion in der Spalte
BYTE VorigeSPSeiten ;keine Neue Seite bei voriger Spalte
BYTE NaechsteSPSeiten ;keine Neue Seite bei nächster Spalte
BYTE TextUOFlag ;Spalte-Text unter/ober Flag
BYTE SpalteOhneTitle ;Spalte Ohne Titel
BYTE MenuEintragAnzahl ;Anzahl der Menu Einträge im Screen-Menu
BYTE ZweitePage ;Zweite Seite Vorhanden
BYTE ScreenSignal ;SignalNr
BYTE RelativeTopC ;Relative Ecke von Oben
BYTE RelativeLeftC ;Relative Ecke von Links
BYTE MenuAnGe ;Momentaniges Angewähltes Menu
LABEL Int_SIZEOF
;;
** Hauptprog
moveq #0,d7 ;Error Code = 0
move.l 4.w,a6 ;EXECBase
move.l #Int_SIZEOF,d0 ;Internal-Struktur
move.l #MEMF_PUBLIC!MEMF_CLEAR,d1 ;Speicher Type: zuerst FAST MEM
jsr _LVOAllocMem(a6) ;Speicher für Variablen reservieren
move.l d0,a5 ;a5 Basis Addr. für alle Variablen
bne.s LibraryO ;Speicher OK!
moveq #21,d7 ;21 = kein Speicher
bra.w Ende ;beenden
LibraryO
bsr.w InitRelative ;Init Relative (kein Reloc Tabelle)
bsr.w LibOeffne ;Libraries öffnen
tst.w d7 ;Fehler Code 0=OK
bne.w SchliesseLibrary ;Error Beende
bsr.w Parameter ;Parameter abfragen
tst.w d7 ;Parameter fehler
bne.s SchliesseLibrary ;Schliesse Libraries
bsr.w WaitOnCaps ;CAPS-Lock Abfrage
cmp.w #10,d7 ;Error wenn d7>10
bhi.s ParameterFree ;Ende wegen Error
tst.w d7 ;d7=0
beq.s Menuerscheine ;BangerMenu Start
moveq #0,d7 ;kein Fehler trotzdem Ende
bra.s ParameterFree
Menuerscheine
bsr.w PubScreenOeffne ;Öffne Screen
tst.w d7 ;Fehler beim Screen Öffnen
bne.s ParameterFree ;gebe Parameter frei
bsr.w LadePrefs ;Lade Prefs
tst.w d7 ;Fehler beim Laden des Prefs Files?
bne.s SchliesseScreen ;JA Schliesse Screen
bsr.w WertePrefsAus ;Prefs Auswerten
tst.w d7 ;Prefs Fehler
bne.s FreiSPrefs ;Speicher Frei vom PrefsFile
bsr.b InitMenu ;Screen Menu Init
tst.b d7 ;Fehler im Menu
bne.s MenuRemove ;Entferne Menu
bsr.w InitGadget ;Gadget Init
tst.w d7 ;Fehler beim Gadget erschaffen ?
bne.s MenuRemove ;Entferne Menus
bsr.w FensterOeffne ;Fenster öffenen
tst.w d7 ;Fehler beim Fenster Öffnen
bne.s RemGad ;Entferne Gadgets
bsr.w SetAndLayout ;Menu aufbau
tst.b d7
bne.s SchliesseFenster ;Schliesse Fenster
move.w #0,d5 ;erstes Menu
bsr.w PrintIUnter ;Text Ausgabe
bsr.w GadAktivieren ;erstes Gadget aktivieren
bsr.w RefreshWin ;Fenster neuaufbau
bsr.w MessageAbFragen ;Fenster verwaltung
bsr.w ClearMenu ;Entferne Menu
SchliesseFenster
bsr.w FensterSchliesse ;Schliesse Fenster
RemGad
bsr.w RemoveGadget ;Entferne Gadgets
MenuRemove
bsr.w RemoveMenu ;Entferne Menu
FreiSPrefs
bsr.w SpeicherPrefs ;Speicher vom Prefs File freigeben
SchliesseScreen
bsr.w ScreenSchliesse ;Schliesse Screen
ParameterFree
bsr.w FreePara ;Read Args wieder freigeben
SchliesseLibrary
bsr.w LibSchliesse ;schliesse Libraries
move.l a5,a1 ;Speicher Addr.
move.l #Int_SIZEOF,d0 ;Größe
jsr _LVOFreeMem(a6) ;Speicher freigeben
Ende
move.l d7,d0 ;Error Code
ende
rts ;Ende
;;
** InitMenu
InitMenu
lea UniGad(pc),a1 ;Universal NewGadget Struktur
move.b RelativeTopC(a5),d4 ;Relative Ecke Oben
move.b RelativeLeftC(a5),d5 ;Relative Ecke Links
add.b d4,gng_TopEdge+1(a1) ;Eintrag in die NewGadget Struktur
add.b d5,gng_LeftEdge+1(a1) ;Eintrag in die NewGadget Struktur
move.l VisualInfo(a5),gng_VisualInfo(a1) ;VisualInfo eintrag
move.l FontAddr(a5),gng_TextAttr(a1) ;TextAttr Struktur eintrag
lea PageGads(pc),a1 ;Seiten umblätter Gadgets
add.b d4,gng_TopEdge+1(a1) ;Init
add.b d5,gng_LeftEdge+1(a1)
move.l VisualInfo(a5),gng_VisualInfo(a1)
move.l FontAddr(a5),gng_TextAttr(a1)
lea PageLeftTxt(pc),a2 ;TextString eintrag
move.l a2,gng_GadgetText(a1)
lea Page2Gads(pc),a1 ;Zweites Seiten umblätter Gadget
add.b d4,gng_TopEdge+1(a1)
add.b d5,gng_LeftEdge+1(a1)
move.l VisualInfo(a5),gng_VisualInfo(a1)
move.l FontAddr(a5),gng_TextAttr(a1)
lea PageRightTxt(pc),a2
move.l a2,gng_GadgetText(a1)
lea VirtualMenu(a5),a0 ;unabhängiges Screen Menu
move.b #NM_TITLE,gnm_Type(a0) ;Titel
lea ProjektName(pc),a1 ;Projekt String
move.l a1,gnm_Label(a0)
lea gnm_SIZEOF(a0),a0 ;Vorspringen
move.b #NM_ITEM,gnm_Type(a0) ;Über
lea InfoName(pc),a1 ;Über String
move.l a1,gnm_Label(a0)
lea InfoTaste(pc),a1 ;Über Taste
move.l a1,gnm_CommKey(a0)
lea gnm_SIZEOF(a0),a0
move.b #NM_ITEM,gnm_Type(a0) ;Beenden
lea QuitName(pc),a1 ;Beenden String
move.l a1,gnm_Label(a0)
lea QuitTaste(pc),a1 ;Beenden Taste
move.l a1,gnm_CommKey(a0)
move.b MenuEintragAnzahl(a5),d0 ;Screen Menu Anzahl
tst.b d0
beq.s keinGrossesMenu ;gar kein UserMenu
lea gnm_SIZEOF(a0),a0
move.b #NM_TITLE,gnm_Type(a0) ;BangerMenu
lea WindowTitle(pc),a1 ;BangerMenu String
move.l a1,gnm_Label(a0)
subq #1,d0
lea MenuData(a5),a1 ;BangerMenu Daten
MenuInitLoop
lea gnm_SIZEOF(a0),a0 ;Vorspringen zum nächsten Menu
move.b #NM_ITEM,gnm_Type(a0) ;Titel
move.l BaM_MenuTitleText(a1),gnm_Label(a0) ;Titel String
move.l BaM_MenuKey(a1),gnm_CommKey(a0) ;Menu Taste
lea BaM_SIZEOF(a1),a1 ;BangerMenu Struktur vorspringen zum nächsten
dbra d0,MenuInitLoop
keinGrossesMenu
move.l GADBase(a5),a6 ;GadTools Base
lea VirtualMenu(a5),a0 ;NewMenu Struktur
lea MenuTags(pc),a1 ;Menu TAGS
jsr _LVOCreateMenusA(a6) ;Menu Struktur erschaffen
move.l d0,MenuPtr(a5) ;Menu Addr.
beq.s MenuError ;Fehler ?
move.l d0,a0
move.l VisualInfo(a5),a1 ;VisualInfo Addr.
suba.l a2,a2 ;keine TAGS
jsr _LVOLayoutMenusA(a6) ;Menu Aufbauen
move.l d0,d1 ;alles geklappt
bne.s MenuOK ;JA
MenuError
moveq #38,d7 ;38=Menu Fehler
MenuOK
rts
RemoveMenu
move.l GADBase(a5),a6 ;GadTools Base
move.l MenuPtr(a5),a0 ;Menu Addr.
jsr _LVOFreeMenus(a6) ;Gebe Speicher der Menu Struktur frei
rts
;;
** SetAndLayout ClearMenu PrintIUnter
SetAndLayout
move.l INTUIBase(a5),a6 ;Intuition Base
move.l WindowHandle(a5),a0 ;Fenster Addr.
move.l MenuPtr(a5),a1 ;Menu Addr.
jsr _LVOSetMenuStrip(a6) ;Setze Menu
move.l d0,d1 ;Fehler ?
bne.s SetLayOK ;NEIN
moveq #38,d7 ;Menu Fehler
SetLayOK
rts
ClearMenu
move.l INTUIBase(a5),a6 ;Intuition Base
move.l WindowHandle(a5),a0 ;Fenster Addr.
jsr _LVOClearMenuStrip(a6) ;Entferne Menu
rts
PrintIUnter
lea PrintPage(a5),a1 ;PrintIText Addr
lea (a1,d5.w),a1 ;welches Menu
move.l (a1),a1
lea it_SIZEOF(a1),a1
move.l WinRPort(a5),a0 ;Fenster RastPort Addr.
moveq #0,d0
moveq #0,d1
move.b RelativeTopC(a5),d1 ;Relative
move.b RelativeLeftC(a5),d0
move.l INTUIBase(a5),a6 ;Intuition Base
jsr _LVOPrintIText(a6) ;Schreibe Text
rts
;;
** WertePrefsAus
WertePrefsAus
move.w SCHoehe(a5),d0 ;Screen Höhe
sub.w #20,d0 ;Höhe-20
moveq #10,d1
divu.w d1,d0 ;Höhe/10
move.w d0,MaxSpaltenZahl(a5) ;Max. Anzahl in einer Spalte
move.l FileSpeicher(a5),a1 ;PrefsFile anfang
move.l Filegroesse(a5),d0 ;PrefsFile größe
move.l a1,a2 ;PrefsFile -->a2
add.l d0,a2 ;PrefsFile Ende
MenuDochNoch
cmp.l #'MENU',(a1) ;MENU vorhanden
beq.s MenuEintrag ;JA!
keinMenuReturn
cmp.b #10,(a1)+ ;Suche Return
bne.s keinMenuReturn
cmp.l a1,a2 ;PrefsFile schon Ende
bgt.s MenuDochNoch ;NEIN dann nach MENU suchen
lea MenuData(a5),a3 ;BangerMenu Struktur
move.l FileSpeicher(a5),a1 ;PrefsFile
bra.w UnterMenuGefunden
MenuEintrag
lea MenuData(a5),a3 ;BangerMenu Struktur
moveq #0,d0
EintragMenuSLoop
cmp.b #10,(a1)+ ;Suche Return
bne.s EintragMenuSLoop
EintragMenu2Loop
move.b #0,-1(a1) ;NULL Byte als Terminierung
cmp.l #'ENDM',(a1) ;Vergleiche ENDM
beq.s AlleMenuEintrage ;JA alle Menu einträge gefunden
cmp.l a1,a2 ;Schon Ende
bls.w PrefsWerteError ;JA dann Fehler in den Prefs
lea 1(a1),a1 ;ein Leerzeichen bevor Menuname Anfängt
move.l a1,(a3) ;MenuName in BangerMenu Struktur eintragen
weiterSuchenMKey
move.b (a1)+,d1
cmp.l #'MKEY',(a1) ;vergleiche MKEY vorhanden
beq.s TasteFuerMenu ;JA Menu hat eine Taste
cmp.b #10,d1 ;Menuname Ende ?
bne.s weiterSuchenMKey ;Nein
MKeyGefunden
lea BaM_SIZEOF(a3),a3 ;nächste Struktur für ein neues Menu
addq #1,d0 ;Zähle Menus
cmp.b #50,d0 ;schon 50 ?
beq.s AlleMenuEintrage ;JA dann abschliessen
bra.s EintragMenu2Loop ;Ansonsten nächstes Menu extrahieren
TasteFuerMenu
move.b #0,-1(a1) ;MeunName NULL Byte Termieren
lea 5(a1),a1 ;Vorspringen zum Zeichen
move.l a1,BaM_MenuKey(a3) ;Zeichen eintragen in BangerMenu
EintragMenu3Loop
cmp.b #10,(a1)+ ;Return ?
bne.s EintragMenu3Loop ;NEIN
bra.s MKeyGefunden ;JA und zurück
AlleMenuEintrage
move.b d0,MenuEintragAnzahl(a5) ;Anzahl der Menu Einträge im Screen-Menu
lea MenuData(a5),a3 ;BangerMenu Struktur
NaechstesUnterM
move.l BaM_MenuTitleText(a3),a0 ;MenuTitel
move.l FileSpeicher(a5),a1 ;PrefsFile Anfang
move.b (a0),d0 ;Erstes Zeichen vom MenuTitel --> d0
TestUnterMenuLoop
cmp.b (a1),d0 ;Vergleiche PrefsFile mit d0
beq.s MenuBezeich ;gleich
keinMenuBezReturn
cmp.b #10,(a1)+ ;Suche Return
bne.s keinMenuBezReturn
cmp.l a1,a2 ;PrefsEnde
bgt.s TestUnterMenuLoop ;nächste Zeile im PrefsFile
bra.w PrefsWerteError ;Menu Eintrag Leer
MenuBezeich
move.l a0,a4 ;MenuTitel
MenuBezeichLoop
move.b (a0)+,d1 ;Buchstabe --> d1
tst.b d1 ;MenuTitle Ende ?
beq.s UnterErstGefunden ;JA --> MenuDaten gefunden
cmp.b (a1)+,d1 ;Vergleiche Prefs mit MenuTitel
beq.s MenuBezeichLoop ;Noch gleich
move.l a4,a0 ;Zurück setzen des MenuTitels
bra.s keinMenuBezReturn ;und weiter suchen
UnterErstGefunden
move.b #0,(a1)+ ;Prefs MenuTitel Null Terimiert
UnterMenuGefunden
moveq #0,d5
moveq #0,d4 ;d4=SpaltenAnzahl
UnterMenu2Loop
moveq #0,d0 ;Anzahl der Gadgets
moveq #0,d2 ;Längste Gadget
moveq #0,d3 ;0/1
UnterMenuLoop
moveq #0,d1 ;Aktuell Gadgetlänge
cmp.l a1,a2 ;PrefsEnde ?
beq.w Unter2MenuFertig ;JA Daten für Menu fertig
cmp.l #'END ',(a1) ;END vorhanden
beq.w UnterMenuFertig ;JA Daten für Menu fertig
cmp.l #'COLT',(a1) ;COLT vorhanden
beq.s SpaltenTitle ;Neu Spalte
lea 1(a1),a1 ;Ein Vorrücken da ein Space vor den Daten liegt
cmp.l a1,a2 ;PrefsEnde ?
beq.w Unter2MenuFertig ;JA Daten für Menu fertig
keinReturn
addq #1,d1 ;länge GadgetName aus der Prefs
cmp.b #10,(a1)+ ;Return suchen
bne.s keinReturn
move.b #0,-1(a1) ;das Return ersetzen mit NullByte
tst.b d3 ;d3 0/1 entweder Gadgetname oder Programm bzw. Batchdatei
beq.s BreiteZaehlen ;GadgetName
moveq #0,d3 ;nächste Zeile ist wieder ein Gadgetname
bra.s UnterMenuLoop ;nächste Zeile bearbeiten
BreiteZaehlen
moveq #1,d3 ;nächste Zeile ist Programm bzw. Batchdatei
addq #1,d0 ;d0=Anzahl der Gadgets
cmp.b d2,d1 ;d2 enthält den längsten Gadgetnamen
bls.s UnterMenuLoop ;nächste Zeile bearbeiten
move.b d1,d2 ;neue länge war größer als alte
bra.s UnterMenuLoop ;nächste Zeile bearbeiten
SpaltenTitle
cmp.b #50,d4 ;SpaltenAnzahl=50 ?
beq.w MenuIstVoll ;JA keine Spalte mehr
lea 9(a1),a1 ;Vorsprung zum SpaltenTitle
tst.b d4 ;erste Spalte ?
beq.s keineBaMDaten ;JA
bsr.s Spalteninit ;Spalten Daten eintragen
tst.l d7 ;Gadget über dem Max. Check
bne.s MenuGadgetzuviel ;JA zu viele
bra.s BaMDatenDA
keineBaMDaten
lea BaM_SpaltenTitleText(a3),a0 ;SpaltenTitel eintrag in BangerMenu Struktur
BaMDatenDA
move.l a1,(a0) ;PrefsSpaltenTitel
SpaltenTitleLoop
cmp.b #10,(a1)+ ;Suche Return
bne.s SpaltenTitleLoop
move.b #0,-1(a1) ;Mit NULL Byte Terimieren
addq #1,d4 ;SpaltenAnzahl erhöhen
bra.s UnterMenu2Loop ;Nächste Zeile
MenuGadgetzuviel
sub.w d0,d5 ;Wieder alte Gadgets Anzahl herstellen
moveq #0,d7 ;d7 korrigieren
bra.w MenuIstVoll ;diese Menu zu voll
Spalteninit
moveq #-1,d7 ;Error wenn Gadget zu viel sind
add.w d0,d5 ;GadgetAnzahl der vorigen Spalte addieren
cmp.w #2560,d5 ;gesamt Gadgets Anzahl über 2560 ?
bge.s keineSpaltemehrMoeg ;JA - dann keine weiteren Gadgets mehr
move.w d4,d6 ;SpaltenAnzahl --> d6
subq #1,d6 ;SpaltenAnzahl-1
lea BaM_GadgetLaenge(a3),a6 ;Längste Gadget in der Spalte
lea (a6,d6.w),a6
lea BaM_SpaltenLaenge(a3),a4 ;Spalten Länge
lea (a4,d6.w),a4
add.w d6,d6 ;SpaltenAnzahl*4, weil long
add.w d6,d6
lea BaM_SpaltenTitleText(a3),a0 ;auf Aktuellen SpaltenTitle setzen
lea (a0,d6.w),a0
move.l (a0),d7 ;SpaltenTitel Addr. d7
SpaltenCheck
cmp.w MaxSpaltenZahl(a5),d0 ;Max. Anzahl an Gadget pro Spalte
bls.s nurnocheineSpalte ;weniger noch ein Spalte
sub.w MaxSpaltenZahl(a5),d0 ;Max. Anzahl an Gadget pro Spalte abziehen von Anzahl der Gadgets
move.b MaxSpaltenZahl+1(a5),(a4)+ ;Spaltenlänge = max.
move.b d2,(a6)+ ;Längsten GadgetNamen
move.l d7,(a0)+ ;Spalte besitzt den gleichen SpaltenTitel
tst.b SpalteOhneTitle(a5) ;Spalte Ohne Titel?
bne.s NaechstenSPTitleKoor ;JA
SPTitleKorrFertig
addq #1,d4 ;Spalten Anzahl erhöhen
cmp.b #50,d4 ;50 Spalten erreicht ?
beq.s keineSpaltemehrMoeg ;JA genug Spalten
bra.s SpaltenCheck ;Ansonsten weitere Erzeugen
NaechstenSPTitleKoor
move.l d7,a1 ;a1=Gadgetname aus Konfig
move.w MaxSpaltenZahl(a5),d1 ;d1=Max. Anzahl an Gadgets/Spalte
add.w d1,d1 ;*2 weil GadgetName + ProgrammName
SPTitle1Korr
tst.b (a1)+ ;NULL Byte suche
bne.s SPTitle1Korr
subq #1,d1 ;Schon alle Gadgets
bne.s SPTitle1Korr ;Nein
move.l a1,d7 ;d7=Addr. der Gadget der nächsten Spalte
bra.s SPTitleKorrFertig
nurnocheineSpalte
move.b d0,(a4) ;Spaltenlänge
move.b d2,(a6) ;Längsten GadgetNamen
move.l d7,(a0)+ ;Spalte besitzt den gleichen SpaltenTitel
moveq #0,d7 ;d7 wieder löschen
keineSpaltemehrMoeg
rts
Unter2MenuFertig
move.l FileSpeicher(a5),a1 ;PrefsFile anfang
moveq #1,d4 ;Eine Spalte
bra.s AltePrefsOhneSpalten
UnterMenuFertig
tst.b d4 ;Spalten ?
bne.s JauEinSpalt ;JA
addq #1,d4 ;Spalten Anzahl +1
tst.b d0 ;keine Gadgets ?
beq.s JauEinSpalt ;JA
move.w d0,d1 ;Gadgets Anzahl --> d1
add.w d1,d1 ;d1*2 (GadgetNamen + Programm/Batch)
addq #1,d1 ;d1+1
EndeVonMenu
tst.b -(a1) ;Suche NULL Byte (Ende einer Zeile)
bne.s EndeVonMenu
subq #1,d1 ;Gefunden d1-1
bne.s EndeVonMenu
EinVorRueck
lea 1(a1),a1 ;Nächste Zeile
cmp.b #' ',(a1) ;Leerzeichen
beq.s EinVorRueck ;JA
AltePrefsOhneSpalten
lea BaM_SpaltenTitleText(a3),a0 ;SpaltenTitel --> in diesem Fall nicht
move.l a1,(a0) ;darum wird das SpalteOhneTitle Flag gesetzt
move.b #-1,SpalteOhneTitle(a5) ;Spalte Ohne Titel
JauEinSpalt
bsr.w Spalteninit ;Spalten Daten init
tst.b d7 ;Zu viele Gadgets
bne.w MenuGadgetzuviel ;Gadgets Anzahl wieder herstellen
tst.b SpalteOhneTitle(a5) ;Spalte Ohne Titel
beq.s MenuIstVoll ;NEIN
neg.b d4 ;SpaltenAnzahl wieder korrigieren
move.b #0,SpalteOhneTitle(a5) ;Flag zurück setzen für nächstes Menu
MenuIstVoll
lea BaM_SpaltenAnzahl(a3),a4 ;Spalten Anzahl eintragen
move.b d4,(a4)
lea BaM_GadgetAnzahl(a3),a4 ;Gadgets Anzahl Insgesamt pro Menu eintragen
move.w d5,(a4)
lea BaM_SIZEOF(a3),a3 ;Nächstes Menu
tst.l (a3) ;vorhanden ?
bne.w NaechstesUnterM ;JA
rts
PrefsWerteError
moveq #37,d7 ;37=Fehler im Einstellungsfile
rts
;;
** Parameter
Parameter
move.l DOSBase(a5),a6 ;DOS Befehle
lea ParaTemplate(pc),a1 ;Parameter String
move.l a1,d1
lea PrefsLoadKey(a5),a1 ;Speicher für die 4 Parameter
move.l a1,d2
moveq #0,d3 ;rdargs keine
jsr _LVOReadArgs(a6) ;Parameter einlesen und parsen
move.l d0,RDArgs(a5) ;Resultat nach RDArgs
bne.s ParaOK ;Parameter OK!
jsr _LVOIoErr(a6) ;Error Routine
move.l d0,d1 ;Error Nr.
moveq #0,d2 ;keine Überschrift
jsr _LVOPrintFault(a6) ;FehlerAusgabe im Con-Fenster
moveq #32,d7 ;32=falsche Parameter angabe
ParaOK
rts
FreePara
move.l RDArgs(a5),d1 ;ReadArgs Resultat
move.l DOSBase(a5),a6 ;wieder Freigeben
jsr _LVOFreeArgs(a6)
rts
;;
** Warte auf Caps Lock
WaitOnCaps
tst.l NOKEYArray(a5) ;kein CAPS-Lock
bne.s NOKeyJA ;ja weiter
move.l 4.w,a6 ;EXECBase
jsr _LVOCreateMsgPort(a6) ;Neuen Message Port init
move.l d0,MsgPortAddr(a5) ;Addr. des Message Port
bne.s MsgPortOK ;Message Port vorhanden
moveq #29,d7 ;29=kein MsgPort
rts
MsgPortOK
move.l d0,a0
move.l #IOSTD_SIZE,d0 ;normale IORequest-Struktur
jsr _LVOCreateIORequest(a6) ;Init IORequest
move.l d0,TastenIBlock(a5) ;Addr. IORequest
bne.s OeffneDev ;kein Fehler
moveq #30,d7 ;30=konnte kein IORequest init
bra.s FreiMsgP
OeffneDev
lea inputname(pc),a0 ;input.device
move.l d0,a1 ;IORequest Addr.
moveq #0,d0 ;Unit 0
move.l #IOF_QUICK,d1 ;Flags
jsr _LVOOpenDevice(a6) ;Öffnen des Input.device
tst.l d0 ;Fehler ?
beq.s DevOK ;Nein
moveq #31,d7 ;31=konnte Device nicht öffnen
bra.s IOReqDel
DevOK
move.l TastenIBlock(a5),a0 ;IORequest Struktur
move.l IO_DEVICE(a0),a6 ;Device Node name
jsr _LVOPeekQualifier(a6) ;Tastaturstatus
move.w d0,d1 ;d1=InputEvent-Struktur
and.w #IEQUALIFIER_LEFTBUTTON,d1 ;Bit Maske für Linken Mouse Knopf
cmp.w #IEQUALIFIER_LEFTBUTTON,d1 ;gleich Linke Mouse Knopf
beq.s CAPSgedrueckt
and.w #IEQUALIFIER_CAPSLOCK,d0 ;Bit Maske für CAPSLock
cmp.w #IEQUALIFIER_CAPSLOCK,d0 ;CAPSLock gedrückt
beq.s CAPSgedrueckt ;JA
moveq #10,d7 ;Beenden
CAPSgedrueckt
move.l 4.w,a6 ;EXECBase
lea TastenIBlock(a5),a1 ;IORequest
jsr _LVOCloseDevice(a6) ;SchliesseDevice
IOReqDel
move.l TastenIBlock(a5),a0 ;IORequest
jsr _LVODeleteIORequest(a6) ;Gib Speicher Frei
FreiMsgP
move.l MsgPortAddr(a5),a0 ;Message Struktur
jsr _LVODeleteMsgPort(a6) ;Gib Message Struktur frei
NOKeyJA
rts
;;
** GadAktivieren
GadAktivieren
move.l GadgetAddr(a5),a3 ;GadgetList Addr
lea GadgetPage(a5),a4 ;Gadget Anfang einer Seite
lea (a4,d5.w),a4 ;welches Menu
move.l (a4),a4
move.l (a4),a4
moveq #1,d6 ;Aktiviere
bsr.w SelGK ;Setze Gadget
lea GadgetPage(a5),a4 ;Gadget Anfang einer Seite
lea (a4,d5.w),a4
move.l (a4),a4
move.l a4,AnGad(a5) ;Angewählte Gadget Addr.
rts
;;
** InitRelative
InitRelative
lea topazFName8(pc),a0 ;FontName Addr.
lea topaz8(pc),a1 ;TextAttr-Struktur
move.l a0,(a1) ;Init Addr. in der Struktur
move.l a1,FontAddr(a5) ;Varibale für TextAttr-Struktur
rts
;;
** MessageAbFragen MsgVerarbeitung Sprung
MessageAbFragen
move.l WindowHandle(a5),a0 ;a0=FensterAddr.
move.l wd_UserPort(a0),a0 ;a0=Fenster UserPort
move.l 4.w,a6 ;a6=EXECBase
jsr _LVOWaitPort(a6) ;Auf Nachricht warten für das Fenster
nocheine
move.l GADBase(a5),a6 ;a6=GadTools Base
move.l WindowHandle(a5),a0 ;a0=FensterAddr.
move.l wd_UserPort(a0),a0 ;a0=Fenster UserPort
jsr _LVOGT_GetIMsg(a6) ;Hole Nachricht
move.l d0,a1 ;a1=Nachricht
tst.l d0 ;keine Nachricht mehr da?
beq.s MessageAbFragen ;JA
move.w im_Qualifier(a1),d2 ;d2=Qualifier Tasten
move.l im_Class(a1),d3 ;d3=Nachrichten Klasse
move.w im_Code(a1),d4 ;d4=Nachrichten Code
move.l im_IAddress(a1),a4 ;a4=Addresse
jsr _LVOGT_ReplyIMsg(a6) ;Antwort
cmpi.l #IDCMP_CLOSEWINDOW,d3 ;Fenster schliessen
beq.w ende ;dann ende
cmpi.l #IDCMP_REFRESHWINDOW,d3 ;Fenster neu zeichen
beq.w RefreWin
cmpi.l #IDCMP_GADGETUP,d3 ;Gadget losgelassen
beq.w GadAuswertung
cmpi.l #IDCMP_VANILLAKEY,d3 ;normaler Tasten druck
beq.w VanTaste
cmpi.l #IDCMP_RAWKEY,d3 ;Spezial Tasten
beq.w RAWTaste
cmp.l #IDCMP_MENUPICK,d3 ;Menu
beq.s MenuAuswertung
bra.s nocheine
** MenuAuswertung
MenuAuswertung
cmpi.w #MENUNULL,d4 ;kein Menu aus gewählt
beq.b nocheine
cmp.w #$F800,d4 ;Über
beq.w About
cmp.w #$F820,d4 ;Beeenden
beq.w ende
moveq #0,d6
sub.w #$F801,d4 ;d4=vielfaches von 20
MenuErmittelLoop
tst.w d4 ;d4=0?
beq.s MenuWeiterWert ;JA
sub.w #$20,d4 ;d4-20
addq #1,d6 ;d6=Menuzähler
bra.s MenuErmittelLoop
MenuWeiterWert
cmp.b MenuAnGe(a5),d6 ;Angewähltes Menu=d6
beq.w nocheine ;JA
bsr.w ReGadList ;Entferne Gadget Liste
bsr.w RemoveGadget ;gebe Gadget speicher frei
move.b d6,MenuAnGe(a5) ;neues Angewähltes Menu
move.w HoeheWin(a5),AlteHoeheWin(a5) ;Alte Fenster Höhe
move.w BreiteWin(a5),AlteBreiteWin(a5) ;Alte Fenster Breite
bsr.w InitGadget ;Gadget erschaffen
tst.b d7 ;Fehler
beq.s NeuMenuGadgetOK ;Nein
rts
NeuMenuGadgetOK
moveq #0,d5
move.w d5,AnPage(a5) ;erste Seite ist angewählt
move.w AlteHoeheWin(a5),d0 ;d0=alte Fenter Höhe
cmp.w HoeheWin(a5),d0 ;vergleiche mit jetziger Fenster Höhe
bls.s VergroesserWin ;Verändere Fenster
move.w AlteBreiteWin(a5),d0 ;d0=alte Fenter Breite
cmp.w BreiteWin(a5),d0 ;vergleiche mit jetziger Fenster Breite
bgt.s keinVergroessern ;Fenster nicht verändern
VergroesserWin
move.l WindowHandle(a5),a0 ;a0=Fenster Addr.
move.w BreiteWin(a5),d0 ;d0=FensterBreite
sub.w AlteBreiteWin(a5),d0 ;d0-alte FensterBreite
lsr.w #1,d0 ;d0/2
neg.w d0 ;-d0
move.w HoeheWin(a5),d1 ;d1=FensterHöhe
sub.w AlteHoeheWin(a5),d1 ;d1-alte FensterHöhe
lsr.w #1,d1 ;d1/2
neg.w d1 ;-d1
move.l INTUIBase(a5),a6 ;a6=Intuition Base
jsr _LVOMoveWindow(a6) ;Verschiebe Fenster
move.l WindowHandle(a5),a0 ;a0=Fenster Addr.
move.w BreiteWin(a5),d0 ;d0=FensterBreite
sub.w AlteBreiteWin(a5),d0 ;d0-alte FensterBreite
move.w HoeheWin(a5),d1 ;d1=FensterHöhe
sub.w AlteHoeheWin(a5),d1 ;d1-alte FensterHöhe
jsr _LVOSizeWindow(a6) ;Vergrößere Fenster
keinVergroessern
bsr.w AddGadList ;GadgetListe anfügen
bsr.w PrintIUnter ;Text Ausgeben
bsr.w GadAktivieren ;erstes Gadget aktivieren
bra.w nocheine
;;
** About
About
move.l WindowHandle(a5),a0 ;a0=Fenster Addr.
lea AbReqTi(pc),a2 ;a2=RequesterTitel
lea AbReqTxt(pc),a3 ;a3=RequesterText
lea AbGadTxt(pc),a4 ;a4=RequesterGadgetText
lea EndeReq(pc),a1 ;a1=EasyRequesterStruktur
move.l a2,8(a1)
move.l a3,12(a1)
move.l a4,16(a1)
suba.l a2,a2
suba.l a3,a3
move.l INTUIBase(a5),a6 ;a6=Intuition Base
jsr _LVOEasyRequestArgs(a6) ;Requester aufrufen
bra.w nocheine
;;
** RefreWin
RefreWin
bsr.w RefreshWin ;Fenster Neuzeichen
bra.w nocheine
;;
** RAWTaste
RAWTaste
move.b d2,d1
and.b #IEQUALIFIER_CONTROL,d1
bne.s CtrlTaste
and.b #IEQUALIFIER_LSHIFT!IEQUALIFIER_RSHIFT,d2
bne.s ShiftTaste
cmp.b #$4e,d4 ;rechts
beq.w rechteBank
cmp.b #$4f,d4 ;links
beq.w linkeBank
cmp.b #$4d,d4 ;Down
beq.w DownTaste
cmp.b #$4c,d4 ;Up
beq.w UpTaste
bra.w nocheine
VanTaste
cmp.b #$0d,d4 ;Return
beq.s Auswahl
cmp.b #$1b,d4 ;Esc
beq.w ende
cmp.b #'<',d4 ;vorige Seite
beq.s PfeilLinks
cmp.b #'>',d4 ;nächste Seite
beq.s PfeilRechts
bclr #5,d4 ;bit 5 löschen Groß und Kleinschreibung gleich
cmp.b #'Q',d4 ;q/Q
beq.w ende
bra.w nocheine
ShiftTaste
cmp.b #$4e,d4 ;rechts+shift
beq.w rechtsShift
cmp.b #$4f,d4 ;links+shift
beq.w linkeShift
cmp.b #$4d,d4 ;Down+shift
beq.w DownShift
cmp.b #$4c,d4 ;Up+shift
beq.w UpShift
bra.w nocheine
CtrlTaste
cmp.b #$4e,d4 ;rechts+shift
beq.w rechtsCtrl
cmp.b #$4f,d4 ;links+shift
beq.w linkeCtrl
bra.w nocheine
Auswahl
move.l AnGad(a5),a4 ;a4=Angewählte GadgetAddr.
move.l (a4),a4
bra.s GadExe
PfeilLinks
tst.w AnPage(a5) ;erste Seite
beq.w nocheine ;JA
bra.w PageLGAn
PfeilRechts
bsr.s MenuDataInit ;Daten zur jetzigen Seite heraussuchen
moveq #0,d0
move.b BaM_SeitenAnzahl(a4),d0 ;d0=Seiten Anzahl
cmp.w AnPage(a5),d0 ;vergleiche mit angewählter Seite
beq.w nocheine ;letzte Seite
bra.w PageRGAn
MenuDataInit
lea MenuData(a5),a4 ;BangerMenu Struktur
moveq #0,d0
moveq #0,d1
move.b MenuAnGe(a5),d0 ;Angewähltes Menu
move.w #BaM_SIZEOF,d1 ;BangerMenu Struktur Größe
mulu.w d0,d1
lea (a4,d1.w),a4 ;BangerMenuData
rts
;;
;;
** GadAuswertung
GadAuswertung
lea PageLAddr(a5),a0 ;a0=GadgetAddr. vorige Seiten Gadget
move.w AnPage(a5),d5 ;d5=Angewählte Seite
lea (a0,d5.w),a0
move.l (a0),a0
cmp.l a0,a4 ;vergleiche mit Addresse
beq.w PageLGAn ;vorige Seite gewählt
lea PageRAddr(a5),a0 ;a0=GadgetAddr. nächste Seiten Gadget
lea (a0,d5.w),a0
move.l (a0),a0
cmp.l a0,a4 ;vergleiche mit Addresse
beq.w PageRGAn ;nächste Seite gewählt
GadExe
move.l gg_UserData(a4),a1 ;a1=Addr. des GadgetNamen aus der Konfig
SucheAnfangExe
tst.b (a1)+ ;Suche Null Bye
bne.s SucheAnfangExe
cmp.b #' ',(a1) ;Leerzeichen
bne.s keinLeerCom ;keins
lea 1(a1),a1 ;sonst ein weiter
keinLeerCom
move.l DOSBase(a5),a6 ;a6=DOS Base
move.l a1,a4 ;a4=Addr. des Auszuführenden Strings
ComCDTest
move.b (a1)+,d0 ;d0=ein Buchstabe
tst.b d0 ;Null Byte?
beq.s ComEnde ;JA
cmp.b #'[',d0 ;suche Klammer
bne.s ComCDTest ;keine
cmp.w #'C]',(a1) ;dannach C]
bne.s ComCDTest ;Nein
move.b #0,-2(a1) ;vor der Klammer mit NULL abschließen
move.l a4,d1 ;d1=Ausführbarer String
jsr _LVOFilePart(a6) ;Filename suchen
move.l a4,d1 ;d1=Pfad
move.l d0,a4 ;a4=Filename
move.b #0,-1(a4) ;Null Byte zwischen Pfad und Filenamen
move.l #ACCESS_READ,d2 ;d2=Lesend
jsr _LVOLock(a6) ;Besetzen
move.l d0,ProgrammDir(a5) ;Lock Addr. des Programm Dir
move.l d0,d1 ;d1=Lock Addr. des Programm Dir
jsr _LVOCurrentDir(a6) ;wechseln des Verzeichnisses
move.l d0,AltesDir(a5) ;Addr. des alten Verzeichnisses
ComEnde
lea AysnchOut(pc),a0 ;a0=AusgabeFenster Daten
move.l a0,d1 ;d1=Fenster
move.l #MODE_OLDFILE,d2 ;d2=AcessMode
jsr _LVOOpen(a6) ;Fenster Öffnen
lea SystemExeTags(pc),a0 ;a0=SystemTags
move.l d0,4(a0) ;FileHandle eintragen als SYS_input
move.l a0,d2 ;d2=Tags
move.l a4,d1 ;d1=Commando
jsr _LVOSystemTagList(a6) ;Commando ausführen
move.l AltesDir(a5),d1 ;d1=altes Verzeichnis
tst.l d1 ;Überhaupt vorhanden
beq.s KeinVerzWechsle ;NEIN
jsr _LVOCurrentDir(a6) ;wechsel zum alten Verzeichnis
move.l ProgrammDir(a5),d1 ;d1=Programm Dir
jsr _LVOUnLock(a6) ;wieder freigeben
KeinVerzWechsle
moveq #10,d7 ;10=Startup warn Meldung
rts
;;
** TastenAuswertung
UpTaste
move.l AnGad(a5),a4 ;a4=Angewähltes Gadget
move.w AnPage(a5),d5 ;d5=Angewählte Seite
lea GadgetPage(a5),a3 ;a3=GadgetListe Addr. abhängig von der Seite
lea (a3,d5.w),a3
move.l (a3),a3
cmp.l a3,a4 ;vergleiche
beq.w DownShift ;erstes Gadget der Seite
lea -4(a4),a3 ;a3=voriges Gadget
bra.s GadAnwaehlen ;und anwählen
DownTaste
move.l AnGad(a5),a4 ;a4=Angewähltes Gadget
move.w AnPage(a5),d5 ;d5=Angewählte Seite
lea 4(a4),a3 ;a3=nächstes Gadget
cmp.l #0,(a3) ;keins mehr?
beq.w UpShift ;JA
GadAnwaehlen
move.l (a4),a4 ;Addr. Angewähltes Gadget
moveq #0,d6 ;d6=nicht aktive
bsr.w SelGK ;Gadget bearbeiten
moveq #1,d6 ;d6=aktive
move.l (a3),a4 ;a4=jetzige Gadget
bsr.w SelGK ;Gadget bearbeiten
move.l a3,AnGad(a5) ;neues angewähltes Gadget Addr.
bra.w nocheine
rechteBank
bsr.w NummerGad ;Daten anlegen
tst.w NaechsteSPLaenge(a5) ;Nächste Spalten Länge=0?
beq.s letztesGDAnw ;Letztes Gadget anwählen
move.w NaechsteSPLaenge(a5),d0 ;d0=Nächste Spalten Länge
move.w RelativeGDPos(a5),d1 ;d1=Relative Gadget Position vom Anfang der Spalte
tst.b NaechsteSPSeiten(a5) ;Nächste Spalte neue Seite?
bne.s NeueSeitebeiRechts ;JA
cmp.w d0,d1 ;vergleiche
bgt.s RechteSpalteKleiner ;nächste Spalte kürzer
move.w JetztigeSPLaenge(a5),d0 ;d0=Jetzige Spalten länge
add.w d4,d0 ;d4=Anzahl der Gadgets bis ausgewähltem
bra.s DieSelbigeSeite ;d0=Anzahl der Gadgets bis Nächste Spalte
RechteSpalteKleiner
add.w d0,d4 ;d4=Nächste Spalte irgendwo in der Mitter
move.w JetztigeSPLaenge(a5),d0 ;d0=Jetzige Spalten länge
sub.w d1,d0 ;d0=Rest der jetzigen Spalte
add.w d4,d0 ;d0=Am Ende der Nächsten Spalte
bra.s DieSelbigeSeite
NeueSeitebeiRechts
moveq #4,d5 ;d5=Nächste Seite
cmp.w d0,d1 ;Nächste Spalte größer ?
bgt.s SpaltePasst ;JA
move.w d1,d0 ;d0=Nächste Spalten Länge
SpaltePasst
bra.b NeueSeite ;Neu Seite init
letztesGDAnw
move.w JetztigeSeite(a5),d0 ;d0=Jetzige Seiten länge
DieSelbigeSeite
subq #1,d0 ;d0=Gadget Anzahl vom Anfang bis zum angewähltem
DieSelbige2Seite
add.w d0,d0 ;*4
add.w d0,d0
move.w AnPage(a5),d5 ;d5=Angewählte Seite
move.l AnGad(a5),a4 ;a4=Angewähltes Gadget
lea GadgetPage(a5),a3 ;a3=GadgetList für die angebene Seite
lea (a3,d5.w),a3
move.l (a3),a3
lea (a3,d0.w),a3 ;a3=Addr. des anzuwählenden Gadgets
bra.b GadAnwaehlen
linkeBank
bsr.w NummerGad ;Längen init
tst.w VorigeSPLaenge(a5) ;Vorige Spalten Länge=0?
beq.s erstesGDAnw ;JA erstes Gadget anwählen
tst.b VorigeSPSeiten(a5) ;Vorige Spalte neue Seite?
bne.s NeueSeitebeiLinks ;JA
move.w VorigeSPLaenge(a5),d0 ;d0=Vorige Spalten Länge
move.w RelativeGDPos(a5),d1 ;d1=Relative Gadget Position vom Anfang der Spalte
cmp.w d0,d1 ;Jetzige Spalte länger
bhi.s LinkeSpalteKleiner ;Vorige Spalte kleiner
sub.w d0,d4 ;d4=aktuelle Position-vorige Spalten länge
move.w d4,d0 ;d0=neues Gadget
bra.b DieSelbigeSeite
LinkeSpalteKleiner
move.w d4,d0 ;d0=aktuelle Position
sub.w d1,d0 ;d0=aktuelle Position-relative Position
bra.b DieSelbigeSeite
erstesGDAnw
moveq #1,d0 ;erstes Gadget
bra.b DieSelbigeSeite
NeueSeitebeiLinks
moveq #-4,d5 ;vorige Seite
move.w VorigeSeitenLaenge(a5),d0 ;d0=Vorige Seiten Länge
move.w VorigeSPLaenge(a5),d1 ;d1=Vorige Spalten Länge
move.w RelativeGDPos(a5),d2 ;d2=relative Position
cmp.w d1,d2 ;vorige Spalte kleiner als jetzige Position
bgt.s NeueSeite ;JA
sub.w d1,d0
add.w d2,d0 ;d0=neue Gadget Position
** NeueSeite
* d0 = Neues Angewähltes GadgetNr. relative zum Anfang
* d5 = Neue SeitenNummer
NeueSeite
subq #1,d0 ;d0=GadgetAnzahl-1
NeueSeite2
add.w AnPage(a5),d5 ;d5=Angewählte Seite
NeueSeite3
move.l AnGad(a5),a4 ;a4=Angewähltes Gadget
cmp.b #36,d5 ;10. Seite
bgt.w nocheine ;JA
move.w d0,d7 ;d7=neue Gadget Position
move.l (a4),a4 ;a4=Gadget Addr.
moveq #0,d6 ;d6=nichtangewählt
bsr.w SelGK ;Gadget Status setzen
bsr.w ReGadList ;GadgetListe entfernen
move.w d5,AnPage(a5) ;neue Seite
bsr.w AddGadList ;GadgetListe hinzufügen
add.w d7,d7 ;d7*4
add.w d7,d7
lea GadgetPage(a5),a3 ;a3=GadgetListe Addr.
lea (a3,d5.w),a3
move.l (a3),a3 ;a3=Gadgets
lea (a3,d7.w),a3 ;a3=neues anzuwählendes Gadget
moveq #0,d7 ;d7=0 (damit keine Fehler vorliegt)
moveq #1,d6 ;d6=Gadget anwählen
move.l (a3),a4 ;a4=GadgetAddr.
bsr.w SelGK ;Gadgetanwählen
move.l a3,AnGad(a5) ;Angewähltes Gadget
bsr.w PrintIUnter ;TextAusgabe
bra.w nocheine
;;
** NummerGad
NummerGad
move.l AnGad(a5),a4 ;a4=Angewähltes Gadget
move.l (a4),a3 ;a3=Gadget Addr.
move.w gg_GadgetID(a3),d6 ;d6=GadgetID Nr.
bsr.w MenuDataInit ;BangerMenuStruktur->a4
lea BaM_SpaltenLaenge(a4),a3 ;a3=SpaltenLängeAddr.
lea BaM_GadgetLaenge(a4),a2 ;a2=GadgetLängeAddr.
moveq #0,d5
move.b BaM_SpaltenAnzahl(a4),d5 ;d5=SpaltenAnzahl
tst.b d5 ;Spalten Ohne Title ?
bpl.s keineUnsinnigeSpalte ;Nein
neg.b d5
keineUnsinnigeSpalte
subq #1,d5 ;d5=SpaltenAnzahl-1
move.w #0,VorigeSPLaenge(a5) ;VorigeSpaltenLänge
moveq #0,d0
moveq #20,d2 ;d2=Breite der Gadgets insgesamt
move.w d6,d4 ;d4=GadgetID Nr.
move.b (a3),d0 ;d0=SpaltenLänge
move.w d0,ErsteSPLaenge(a5) ;ErsteSpaltenLänge
SpaltenHochZLoop
bsr.w SCBreiteBestimmen ;GadgetLänge in Breite umwandeln
cmp.w SCBreite(a5),d2 ;mit ScreenBreite vergleichen
bhi.w SeiteNeuBeiSpalte ;d2 höher neue Seite
move.b #0,VorigeSPSeiten(a5) ;keine Neue Seite bei voriger Spalte
VorigeSeiteKoori
sub.w d0,d6 ;d6=GadgetNr.-SpaltenLänge
cmp.w #1,d6 ;vergleich mit 1
blt.s GadgetSpalteGef ;Spalte gefunden wo Gadget sich befindet
move.w d0,VorigeSPLaenge(a5) ;vorigeSpaltenLänge Koorigieren
add.w #20,d2 ;d2=Breite der Gadget insgesamt
dbra d5,SpaltenHochZLoop ;solange bis keine Spalten mehr vorhanden sind
GadgetSpalteGef
add.w #20,d2 ;d2=Breite der Gadgets insgesamt
move.w d0,JetztigeSPLaenge(a5) ;JetzigeSpaltenLänge
add.w d6,d0
move.w d0,RelativeGDPos(a5)
tst.b d5 ;Noch Spalten vorhanden
beq.s keineSpaltenLaengen ;Nein
subq #1,d5 ;Spaltenanzahl koorigieren
moveq #0,d0
bsr.s SCBreiteBestimmen ;GadgetLänge in Breite umwandeln
move.w d0,NaechsteSPLaenge(a5) ;NächsteSpaltenLänge
cmp.w SCBreite(a5),d2 ;Neue Seite?
bhi.s SeiteNeuBeiNaechster ;JA
move.b #0,NaechsteSPSeiten(a5) ;keine Neue Seite bei nächster Seite
subq #1,d5 ;Spaltenanzahl koorigieren
bmi.s Korri1KeineSpalten
NaechsteSeiteKoori
add.w #20,d2 ;d2=GadgetBreite
sub.w d0,d6 ;d6=negtive GadgetAnzahl
bsr.s SCBreiteBestimmen ;GadgetLänge in Breite umwandeln
cmp.w SCBreite(a5),d2 ;Breiter als Screen ?
bhi.s SeiteNeuBei2Naechster ;JA
dbra d5,NaechsteSeiteKoori ;solange bis keine Spalten mehr da sind
Korri1KeineSpalten
sub.w d0,d6 ;d6=negtive GadgetAnzahl
KorriKeineSpalten
move.b -(a3),d0 ;d0=Letzte Spalten Länge
move.w d0,LetzteSPLaenge(a5) ;Letzte Spalten Länge
SeiteRueckKorr
neg.w d6 ;d6=GadgetAnzahl seit angewähltes Gadget
add.w d4,d6 ;d6=GadgetAnzahl der Seite
move.w d6,JetztigeSeite(a5) ;GadgetAnzahl der jetzigen Seite
rts
keineSpaltenLaengen
move.b #0,NaechsteSPSeiten(a5) ;Nächste Spalte neue Seite: Nein
move.w #0,NaechsteSPLaenge(a5) ;NächsteSpaltenLänge=0
bra.s KorriKeineSpalten
SCBreiteBestimmen
move.b (a3)+,d0 ;d0=SpaltenLänge
moveq #0,d1
move.b (a2)+,d1 ;d1=GadgetLänge
GadgetLaengeBerechne
asl.w #3,d1 ;d1*8 (Pixelgröße)
add.w #10,d1 ;d1+10
add.w d1,d2 ;d2=Breite bislang
rts
SeiteNeuBeiSpalte
moveq #20,d2
moveq #0,d1
move.b -1(a2),d1 ;d1=GadgetLänge
bsr.s GadgetLaengeBerechne
sub.w d6,d4 ;d4=VorigeGadgetAnzahl
move.w d4,VorigeSeitenLaenge(a5) ;VorigeGadgetAnzahl
move.w d6,d4 ;d4=noch vorhandene Gadgets bis angewähltes
move.b #1,VorigeSPSeiten(a5)
move.w d0,ErsteSPLaenge(a5) ;ErsteSpaltenLänge koorigieren
bra.w VorigeSeiteKoori
SeiteNeuBeiNaechster
move.b #1,NaechsteSPSeiten(a5) ;Nächste Spalte neue Seite
SeiteNeuBei2Naechster
move.b -2(a3),d0 ;d0=Letzte Spalten Länge
move.w d0,LetzteSPLaenge(a5) ;Letzte Spalten Länge
bra.s SeiteRueckKorr
;;
** Auswertung PageLeft/PageRight Ctrl Shift
PageLGAn
moveq #-4,d5 ;d5=vorige Seite
NeueSeiteLeft
moveq #0,d0 ;erstes Gadget
bra.w NeueSeite2
PageRGAn
moveq #4,d5 ;d5=nächste Seite
bra.s NeueSeiteLeft
rechtsCtrl
bsr.w MenuDataInit ;BangerMenu Struktur init
moveq #0,d1
move.b BaM_SeitenAnzahl(a4),d1 ;Seiten Anzahl
tst.b d1 ;nur eine Seite?
beq.w letztesGDAnw ;JA
cmp.w AnPage(a5),d1 ;Angewählte Seite=letzte Seite?
bne.s PageRGAn ;Nein
moveq #0,d5 ;erste Seite
moveq #0,d0 ;erstes Gadget
bra.w NeueSeite3
linkeCtrl
bsr.w MenuDataInit ;BangerMenu Struktur init
tst.w AnPage(a5) ;Angewählte Seite=0
bne.s PageLGAn ;Nein
moveq #0,d0 ;erstes Gadget
moveq #0,d5
move.b BaM_SeitenAnzahl(a4),d5 ;d5=letzte Seite
tst.b d5 ;nur eine Seite?
beq.w DieSelbige2Seite ;JA
bra.w NeueSeite3
UpShift
bsr.w NummerGad ;Längen init
move.w RelativeGDPos(a5),d1 ;d1=Relative Gadget Position
sub.w d1,d4 ;d4=Spalten Anfang
move.w d4,d0 ;d0=Spalten Anfang
bra.w DieSelbige2Seite
DownShift
bsr.w NummerGad ;Längen init
move.w JetztigeSPLaenge(a5),d0 ;d0=Jetzige Spalten Länge
move.w RelativeGDPos(a5),d1 ;d1=Relative Gadget Position
sub.w d1,d0 ;d0=Rest der Spalte
add.w d4,d0 ;d0=ende der Spalte
bra.w DieSelbigeSeite
linkeShift
bsr.w NummerGad ;Längen init
move.w RelativeGDPos(a5),d0 ;d0=Relative Position
move.w ErsteSPLaenge(a5),d1 ;d1=Erste Spalten Länge
cmp.w d0,d1 ;erste Spalte Länger?
bgt.s ShiftLinksPasst ;JA
move.w d1,d0 ;ende der ersten Spalte
ShiftLinksPasst
bra.w DieSelbigeSeite
rechtsShift
bsr.w NummerGad ;Längen init
move.w JetztigeSeite(a5),d0 ;d0=Jetzige Seiten länge
move.w LetzteSPLaenge(a5),d1 ;d1=Letzte Spalten Länge
sub.w RelativeGDPos(a5),d1 ;d1=Relative Position abgezogen
bmi.s ShiftRechtsPasst ;negative dann zu kurz
sub.w d1,d0 ;d0=letzte Spalte
ShiftRechtsPasst
bra.w DieSelbigeSeite
;;
**SelGK Selektiert Gadget also ein oder aus
SelGK
bsr.b RemoveGSuche ;Entferne Gadget
tst.l d6 ;d6=0/1
beq.s DisSel ;nicht aktivieren
or.w #GFLG_SELECTED,gg_Flags(a4) ;angewählt Flag setzen
bra.s NunSel
DisSel
eor.w #GFLG_SELECTED,gg_Flags(a4) ;nicht angewählt Flag setzen
NunSel
bsr.b AddGSuche ;Gadget wieder einfügen
rts
RemoveGSuche
move.l WindowHandle(a5),a0 ;a0=Fenster Addr.
move.l a4,a1 ;a1=Gadget Addr.
move.l INTUIBase(a5),a6 ;a6=Intuition Base
jsr _LVORemoveGadget(a6) ;Entferne Gadget
rts
AddGSuche
move.l WindowHandle(a5),a0 ;a0=Fenster Addr.
move.l a4,a1 ;a1=Gadget Addr.
moveq #-1,d0 ;d0=als letztes
jsr _LVOAddGadget(a6) ;Gadget Einfügen
move.l a4,a0 ;a0=Gadget Addr.
move.l WindowHandle(a5),a1 ;a1=Fenster Addr.
suba.l a2,a2 ;a2=keine TAGS
jsr _LVORefreshGadgets(a6) ;Zeichne Gadget neu
rts
ReGadList
move.l WindowHandle(a5),a0 ;a0=Fenster Addr.
lea GadgetListe(a5),a1 ;a1=Gadget Liste für alle 10 Seiten
move.w AnPage(a5),d4 ;d4=angewählte Seite
lea (a1,d4.w),a1
move.l (a1),a1
moveq #-1,d0 ;d0=alle
move.l INTUIBase(a5),a6 ;a6=Intuitions Base
jsr _LVORemoveGList(a6) ;Entferne GadgetListe
move.l WinRPort(a5),a1 ;a1=Fenster RastPort
moveq #0,d0 ;d0=Hintergrund Farbe
move.l GFXBase(a5),a6 ;a6=GFX Base
jsr _LVOSetAPen(a6) ;Zeichenstift auf Hintergrundfarbe setzen
move.l WinRPort(a5),a1 ;a1=Fenster RastPort
moveq #2,d0 ;d0=Linke Ecke
moveq #2,d1 ;d1=Obere Ecke
add.b RelativeLeftC(a5),d0 ;+Relative Linke Koordinate
add.b RelativeTopC(a5),d1 ;+Relative Obere Koordinate
move.w BreiteWin(a5),d2 ;d2=Fenster Breite
subq #5,d2 ;Fenster Breite-5
move.w HoeheWin(a5),d3 ;d3=Fenster Höhe
subq #5,d3 ;Fenster Höhe-5
jsr _LVORectFill(a6) ;Fülle Rechteck aus
rts
AddGadList
move.l WindowHandle(a5),a0 ;a0=Fenster Addr.
lea GadgetListe(a5),a3 ;a3=Gadget Liste für alle 10 Seiten
lea (a3,d5.w),a3 ;d5=angewählte Seite
move.l (a3),a1 ;a1=GadgetListe
moveq #2,d0 ;d0=ab 2. Position
moveq #-1,d1 ;d1=alle Gadgets
suba.l a2,a2 ;a2=keine RequesterGadgets
move.l INTUIBase(a5),a6 ;a6=Intuition Base
jsr _LVOAddGList(a6) ;Füge Gadgets hinzu
move.l (a3),a0 ;a0=GadgetListe
move.l WindowHandle(a5),a1 ;a1=Fenster Addr.
suba.l a2,a2 ;a2=keine Requestergadgets
moveq #-1,d0 ;d0=alle Gadgets
jsr _LVORefreshGList(a6) ;Zeichne GadgetListe neu
bsr.s RefreshWin ;Zeichne Fenster neu
rts
;;
;;
** Refresh Fenster
RefreshWin
move.l GADBase(a5),a6 ;GadTools Base
move.l WindowHandle(a5),a0 ;Fenster Addr.
suba.l a1,a1 ;keine TAGS
jsr _LVOGT_RefreshWindow(a6) ;Neu Zeichnen des Fenster
move.l WindowHandle(a5),a0 ;Fenster Addr.
jsr _LVOGT_BeginRefresh(a6) ;Beginne mit dem Zeichnen
move.l WindowHandle(a5),a0 ;Fenster Addr.
moveq #DOSTRUE,d0
jsr _LVOGT_EndRefresh(a6) ;Beende Zeichen
rts
;;
** Fenster Öffnen
FensterOeffne
move.l INTUIBase(a5),a6 ;Intuition Base
lea Fenster_Tags(pc),a1 ;Fenster Tags
move.l GadgetListe(a5),12(a1) ;Gadget Liste
move.l ScreenHandle(a5),60(a1) ;Screen Addr.
lea WindowTitle(pc),a0 ;Fenster Titel
move.l a0,4(a1)
lea ScreenTitle(pc),a0 ;Screen Titel
move.l a0,20(a1)
move.w BreiteWin(a5),d0 ;Breite des Fensters
move.w d0,30(a1)
sub.w SCBreite(a5),d0 ;-Screen Breite
neg.w d0 ;negieren
asr.w #1,d0 ;/2
move.w d0,54(a1)
move.w HoeheWin(a5),d4 ;Höhe Fenster
move.w d4,38(a1)
move.w SCHoehe(a5),d0 ;Screen Höhe
add.w #50,d0 ;+50
sub.w d4,d0 ;Höhe Fenster - Screen Höhe
asr.w #1,d0 ;/2
move.w d0,46(a1)
suba.l a0,a0 ;keine NewFenster Struktur
jsr _LVOOpenWindowTagList(a6) ;Fenster Öffnen
move.l d0,WindowHandle(a5) ;Fenster Addr.
beq.b ErrorWindow ;Fehler ?
move.l d0,a0
move.l wd_RPort(a0),WinRPort(a5) ;Window RasrPort Addr.
move.l 4.w,a6 ;EXECBase
suba.l a1,a1 ;eigenen Task finden
jsr _LVOFindTask(a6) ;Finde Task
move.l d0,meinTask(a5) ;Task Addr.
beq.s ErrorTask ;Fehler
move.l d0,a0
move.l pr_WindowPtr(a0),alterTask(a5) ;Alten Task sichern
move.l WindowHandle(a5),pr_WindowPtr(a0) ;eigenes Fenster einsetzen
rts
ErrorTask
bsr.s keinTask
ErrorWindow
moveq #26,d7 ;26 = konnte Fenster nicht öffnen oder Task nicht finden
rts
FensterSchliesse
move.l meinTask(a5),a0 ;Task Addr.
move.l alterTask(a5),pr_WindowPtr(a0) ;wieder alten Task einsetzen
keinTask
move.l INTUIBase(a5),a6 ;Intuition Base
move.l WindowHandle(a5),a0 ;Fenster Addr.
jsr _LVOCloseWindow(a6) ;Schliesse Fenster
rts
;;
** GadgetListeInit
* d0=WelcheSeite
* a3=GadgetAddr
* a0=Pointer für CreateGadget
GadgetListeInit
lea PrintPage(a5),a1 ;Text Ausgabe Data für welche Seite
move.l PrintMarkTab(a5),(a1,d0.w) ;TextMarke
lea GadgetPage(a5),a1 ;Gadget Liste für welche Seite
move.l a3,(a1,d0.w) ;GadgetAddr
lea GadgetListe(a5),a0 ;GadgetList für welche Seite
lea (a0,d0.w),a0
move.l GADBase(a5),a6
jsr _LVOCreateContext(a6) ;Erschaffe Gadget Grundgerüst
move.l d0,a0
beq.w ErrorGadget ;Fehler ?
rts
;;
** InitGadget
InitGadget
lea PrintData(a5),a1 ;Spalten Text Data
move.l a1,PrintMarkTab(a5) ;Text Marke
moveq #it_SIZEOF*5,d0
LoescheTextData
move.l #0,(a1)+ ;Lösche Speicher
dbra d0,LoescheTextData
move.b #0,SpalteOhneTitle(a5)
bsr.w MenuDataInit ;MenuDaten holen
moveq #0,d6
move.b #0,BaM_SeitenAnzahl(a4) ;Seiten Anzahl = 0
move.b BaM_SpaltenAnzahl(a4),d6 ;Spalten Anzahl --> d6
tst.b d6
bpl.s NormalSpaltenMitTitle ;d6 positive --> Spalte mit Title
neg.b d6 ;jetzt richtige Spaltenanzahl
move.b #1,SpalteOhneTitle(a5) ;Erkennung Spalte ohne Title
NormalSpaltenMitTitle
subq #1,d6
lea GadgetAddr(a5),a3 ;GadgetAddrListe
moveq #0,d0 ;Seite 0
bsr.s GadgetListeInit ;Erste Seite Init
moveq #0,d3
SpaltenLoop
* a0=GadgetCreatepointer
* a3=GadgetAddressen speicher
* a4=BangerMenu-Struct (data)
* d3=GadgetText (später nach Schleife Ende init)
* d6=Spalten Anzahl
moveq #0,d0
move.b BaM_SpaltenAnzahl(a4),d0 ;Spalten Anzahl
tst.b d0 ;positive
bpl.s NormalSpalten2MitTitle ;JA
neg.b d0 ;sonst 1 Spalte
NormalSpalten2MitTitle
sub.b d6,d0
subq #1,d0
lea BaM_SpaltenLaenge(a4),a1 ;Addr. Spalten Länge
lea (a1,d0.w),a1
moveq #0,d5
move.b (a1),d5 ;Spalten Länge-->d5
move.w d5,d2 ;d2=Spalten Länge
moveq #10,d1
mulu.w d1,d2 ;GadgetHöhe=10 * Länge
add.w #60,d2 ;+60
cmp.w HoeheWin(a5),d2 ;vergleiche Höhe Fenster
bls.s WinGroesseBeh ;Fenster ist kleiner
move.w d2,HoeheWin(a5) ;Fenster verkleinern
WinGroesseBeh
tst.b d5 ;Gadgets vorhanden ?
beq.w COLOhne ;keine
subq #1,d5
lea BaM_GadgetLaenge(a4),a1 ;Addr. Gadgetlänge
lea (a1,d0.w),a1
moveq #0,d4
move.b (a1),d4 ;Gadgetlänge
asl.w #3,d4 ;*8
add.w #10,d4 ;+10
lea UniGad(pc),a1 ;Universal NewGadget Struktur
move.w gng_LeftEdge(a1),d1 ;d1=LinkeEcke
move.w d4,gng_Width(a1) ;Gadgetlänge-->Gadgetbreite
add.w d4,d1 ;LinkeEcke+Gadgetbreite
cmp.w SCBreite(a5),d1 ;vergleiche Screenbreite
bhi.w NeueSeiteInit ;größer Neue Seite
SeitenRueckkehr
lea BaM_SpaltenTitleText(a4),a1 ;Addr. SpaltenTitelText
add.w d0,d0 ;*4 (long)
add.w d0,d0
lea (a1,d0.w),a1
move.l (a1),a1 ;SpaltenTitelText
tst.b SpalteOhneTitle(a5) ;Spalte keinen Titel ?
bne.s GSNameRichtig ;JA
bsr.w TextInit ;Spalten Titel Text Init
tst.b d3
beq.s ErsterGadNameFind ;GadgetName einstellen
move.l d3,a2 ;a2=GadgetName
cmp.b #$20,-1(a2) ;Leerzeichen davor ?
beq.s TauscheReg ;JA
ErsterGadNameFind
tst.b (a1)+ ;im Prefs Text suchen
bne.s ErsterGadNameFind ;noch nicht ende
lea 1(a1),a1 ;ein Zeichen über Springen
GSNameRichtig
move.l a1,d3 ;d3=Addr. GadgetName
TauscheReg
exg a4,d3 ;a4=Addr. GadgetName
InitGadloop
* a0=GadgetCreatepointer
* a3=GadgetAddressen speicher
* a4=GadgetText (aus der Konfig)
* d3=BangerMenuStruct
* d5=GadgetAnzahl pro Spalte
* d6=Spalten Anzahl
moveq #BUTTON_KIND,d0 ;Gadget Type:Knopf
lea UniGad(pc),a1 ;Universal NewGadgetStruktur
move.l a4,gng_GadgetText(a1) ;GadgetText eintragen
add.w #10,gng_TopEdge(a1) ;ObereEcke+10
add.w #1,gng_GadgetID(a1) ;GadgetID Nr. +1
suba.l a2,a2 ;keine TAGS
move.l GADBase(a5),a6 ;Gadtools Base
jsr _LVOCreateGadgetA(a6) ;Gadget erschaffen
move.l d0,(a3)+ ;Addr. in GadgetAddressenliste eintragen
beq.w ErrorGadget ;Fehler
move.l d0,a0 ;a0=Addr. für nächste Gadget Erschaffung
move.l a4,gg_UserData(a0) ;Addr. des GadgetNamen aus der Konfig
bsr.w Return2Find ;Nächster Gadget String
dbra d5,InitGadloop ;Alle Gadgets aus der Spalte
lea UniGad(pc),a1 ;Universal NewGadget Struktur
move.w #20,gng_TopEdge(a1) ;ObereEcke=20
move.b RelativeTopC(a5),d0 ;Relative Obere Koordinate
add.b d0,gng_TopEdge+1(a1) ;hinzu addieren
move.w gng_Width(a1),d0 ;d0=Gadgetbreite
add.w d0,gng_LeftEdge(a1) ;LinkeEcke+Gadgetbreite
add.w #20,gng_LeftEdge(a1) ;+Abstand(20)
exg d3,a4 ;d3=GadgetText a4=BangerMenuStruktur
COLOhne
dbra d6,SpaltenLoop ;bis alle Spalen abgearbeitet sind
lea UniGad(pc),a1 ;Universal GadgetStruktur
move.w gng_LeftEdge(a1),d1 ;d1=LinkeEcke
move.w #20,gng_LeftEdge(a1) ;LinkeEcke+20
move.b RelativeLeftC(a5),d0 ;d0=Relative Linke Koordinate
add.b d0,gng_LeftEdge+1(a1) ;LinkeEcke+Relative Linke Koordinate
move.w #0,gng_GadgetID(a1) ;GadgetIDNr.=0
cmp.w BreiteWin(a5),d1 ;vergleiche Fenster Breite
bls.s WinBreite2Beh ;FensterBreite kleiner
move.w d1,BreiteWin(a5) ;neue Fensterbreite
WinBreite2Beh
tst.b BaM_SeitenAnzahl(a4) ;SeitenAnzahl=0?
beq.s GadgetEndeInit ;JA
bsr.w SeitenGadgetInit ;Seitengadgets einrichten
GadgetEndeInit
move.b #0,ZweitePage(a5) ;keine Zweite Seite
move.l #0,(a3) ;GadgetListe abschließen
rts
;;
** TextInit
* a0=GadgetCreatepointer
* a1=Zeiger auf Col Title Text
* a3=GadgetAddressen speicher
* a4=BangerMenu-Struct (data)
* d0=Spalte
* d3=GadgetText voriges Mal
* d5=GadgetAnzahl pro Spalte
* d6=Spalten Anzahl
TextInit
movem.l a0-a4/d7,-(sp) ;Register sichern
move.w d0,d4 ;d4=Spalte
lea UniGad(pc),a2 ;Univeral NewGadgetStruktur
move.w gng_LeftEdge(a2),d7 ;d7=Linke Ecke
move.w gng_Width(a2),d2 ;d2=Gadgetbreite
move.l PrintMarkTab(a5),a2 ;a2=Text Marke
lea it_SIZEOF(a2),a3 ;a3=Addr. Nächste IntuiTextStruktur
move.l a3,it_NextText(a2) ;Nächste IntuiTextStruk eintragen
move.l #$02000100,(a3) ;Texte Attribute setzen
move.w #19,it_TopEdge(a3) ;ObereEcke=19
move.l FontAddr(a5),it_ITextFont(a3) ;Zeichensatz eintragen
move.l a1,it_IText(a3) ;TextString eintragen
move.l a1,a0 ;a0=SpaltenTitelText
TextEndeLoop
tst.b (a1)+ ;Suche Null Byte
bne.s TextEndeLoop
sub.l a0,a1
move.l a1,d0 ;d0=TextLänge
subq #1,d0 ;Textlänge-1
lsl.w #3,d0 ;Textlänge*8 in Pixeln
sub.w d0,d2 ;Gadgetbreite-Textlänge
bmi.s TextZuLang ;Textlänge zu lang
lsr.w #1,d2 ;Restlänge/2
TextKorritur
add.w d2,d7 ;d7=LinkeEcke+Restlänge
move.b RelativeLeftC(a5),d2 ;Relative Koordinate abziehen
sub.w d2,d7
bpl.s nichtFensterRand ;Noch positive Koordinate
moveq #0,d7 ;Ansonsten LinkeEcke=0
nichtFensterRand
move.w d7,it_LeftEdge(a3) ;LinkeEcke eintragen
move.l a3,PrintMarkTab(a5) ;Text Marker setzen
movem.l (sp)+,a0-a4/d7 ;Alte Register wiederherstellen
rts
TextZuLang
neg.w d2 ;d2=wieder positive Länge
lsr.w #1,d2 ;Länge zu viel /2
neg.w d2 ;d2=negative RestLänge
tst.b d4 ;erste Spalte
beq.s TextKorritur ;JA
sub.b d4,TextUOFlag(a5) ;Spalte-Text unter/ober Flag
beq.s TextKorritur ;gleich Null
addq #1,d4 ;Nächste Spalte
move.b d4,TextUOFlag(a5) ;Markiere Nächste Spalte
sub.w #10,it_TopEdge(a3) ;ObereEcke-10
bra.s TextKorritur
;;
** NeueSeiteInit
* a0=GadgetCreatepointer
* a3=GadgetAddressen speicher
* a4=BangerMenu-Struct (data)
* d0=Spalte
* d3=GadgetText (später nach Schleife Ende init)
* d5=GadgetAnzahl pro Spalte
* d6=Spalten Anzahl
NeueSeiteInit
movem.l d0,-(sp) ;d0 sichern
bsr.s SeitenGadgetInit ;SeitenGadgets einrichten
tst.b d7 ;Fehler ?
beq.s SeitenGadgOK ;Nein
rts
SeitenGadgOK
lea UniGad(pc),a1 ;a1=Universal GadgetStruktur
move.w gng_LeftEdge(a1),d0 ;d0=LinkeEcke
cmp.w BreiteWin(a5),d0 ;vergleiche mit Fensterbreite
bls.s WinBreiteBeh ;größer
move.w d0,BreiteWin(a5) ;neue Fensterbreite,da kleiner
WinBreiteBeh
move.w #20,gng_LeftEdge(a1) ;LinkeEcke=20
move.b RelativeLeftC(a5),d0 ;d0=Relative Linke Koordinate
add.b d0,gng_LeftEdge+1(a1) ;LinkeEcke+Relative Linke Koordinate
move.l #0,(a3)+ ;GadgetListe abschliessen
add.b #4,BaM_SeitenAnzahl(a4) ;SeitenAnzahl+4 (=1 neue Seite)
move.l PrintMarkTab(a5),a1 ;a1=TextMarker
move.l #0,it_NextText(a1) ;keine weiteren Texte mehr
lea it_SIZEOF(a1),a1 ;a1=Nächste Freie IntuiTextStruktur
move.l a1,PrintMarkTab(a5) ;neue TextMarke
moveq #0,d0
move.b BaM_SeitenAnzahl(a4),d0 ;d0=jetzige Seite
bsr.w GadgetListeInit ;Addr. für neue Seite einrichten
tst.b d7 ;Fehler
beq.s NeueGadListeOK ;Nein
rts
NeueGadListeOK
movem.l (sp)+,d0 ;d0 wieder hergestellt
bra.w SeitenRueckkehr
;;
** SeitenGadgetInit
* a0=GadgetCreatepointer
* d6=Spalten Anzahl (ob noche eine Seite kommt oder nicht)
SeitenGadgetInit
moveq #0,d4
move.b BaM_SeitenAnzahl(a4),d4 ;d4=SeitenAnzahl
moveq #BUTTON_KIND,d0 ;Gadget Typ:Knopf
lea PageGads(pc),a1 ;SeitenGadgetStruktur
tst.b ZweitePage(a5) ;Ist das die Zeite Seite?
beq.s kein1Seite ;NEIM
lea PaGadTags2(pc),a2 ;Gadget Wählbar Tags
bra.s doch1Seite
kein1Seite
lea PaGadTags(pc),a2 ;Gadget NichtWählbar Tags
doch1Seite
jsr _LVOCreateGadgetA(a6) ;Gadgeterschaffen
tst.l d0 ;Fehler
beq.b ErrorGadget ;JA
move.l d0,a0 ;a0=SeitenGadgetAddr.
lea PageLAddr(a5),a1 ;vorige SeitenGadgetAddr. Liste
lea (a1,d4.w),a1 ;für diese Seite eintragen
move.l d0,(a1)
moveq #BUTTON_KIND,d0 ;GadgetTyp:Knopf
lea Page2Gads(pc),a1 ;Nächste Seite Gadget Struktur
tst.b d6 ;Noch eine Spalte in bearbeitung ?
bmi.s kein2Seite ;NEIN
cmp.b #36,d4 ;10. Seite ?
beq.s kein2Seite ;keine Neue Seite mehr
lea PaGadTags2(pc),a2 ;Gadget Wählbar Tags
bra.s doch2Seite
kein2Seite
lea PaGadTags(pc),a2 ;Gadget NichtWählbar Tags
doch2Seite
jsr _LVOCreateGadgetA(a6) ;Gadgeterschaffen
tst.l d0 ;Fehler
beq.b ErrorGadget ;JA
move.l d0,a0
lea PageRAddr(a5),a1 ;nächste SeitenGadgetAddr. Liste
lea (a1,d4.w),a1
move.l d0,(a1)
move.b #1,ZweitePage(a5) ;ZweiteSeite vorhanden
rts
;;
** ErrorGadget
ErrorGadget
bsr.s RemoveGadget ;Entferne Gadgets
moveq #25,d7 ;25 = Gadget init Fehler
rts
RemoveGadget
move.l GADBase(a5),a6 ;GadTools Base
bsr.w MenuDataInit ;a4=BangerMenuData Struktur laden
moveq #0,d4
move.b BaM_SeitenAnzahl(a4),d4 ;d4=SeitenAnzahl
GadListeFLoop
lea GadgetListe(a5),a0 ;GadgetListe der einzelnen Seiten
lea (a0,d4.w),a0
move.l (a0),a0
jsr _LVOFreeGadgets(a6) ;Freigeben
subq #4,d4 ;Vorige Seite
bpl.s GadListeFLoop ;Noch eine Seite
rts
Return2Find
tst.b (a4)+ ;Null Byte suchen
bne.s Return2Find
Return1Mal
tst.b (a4)+ ;Nochmal Null Byte suchen
bne.s Return1Mal
cmp.b #$20,(a4) ;Leerzeichen ?
bne.s AltesKonfigFile ;Nein so lassen
lea 1(a4),a4 ;noch ein Zeichen
AltesKonfigFile
rts
;;
** Speicher freigeben von den Einstellungen
SpeicherPrefs
move.l FileSpeicher(a5),a1 ;Prefs File Speicher
move.l Filegroesse(a5),d0 ;Prefs File größe
move.l 4.w,a6 ;EXECBase
jsr _LVOFreeMem(a6) ;Gebe Speicher Frei
rts
;;
** Lade Einstellungen
LadePrefs
move.l PrefsLoadKey(a5),d1 ;PrefsFilename
tst.l d1 ;vorhanden
bne.s EigenesPrefsFile ;JA!
lea PrefsFile1(pc),a3 ;Sonst im eigenem Verzeichnis suchen
move.l a3,d1
EigenesPrefsFile
move.l #MODE_OLDFILE,d2 ;nur lesend
move.l DOSBase(a5),a6 ;DOS
jsr _LVOOpen(a6) ;Öffne File
move.l d0,PrefsFileHandle(a5) ;File Addr.
bne.s OpenPrefsFile ;JA!
lea PrefsFileName(pc),a3 ;Suche im S: Verzeichnis
move.l a3,d1
move.l #MODE_OLDFILE,d2 ;nur lesend
jsr _LVOOpen(a6) ;Öffne File
move.l d0,PrefsFileHandle(a5) ;File Addr.
beq.s OpenFileError ;NEIN!
OpenPrefsFile
move.l d0,d1 ;File Addr.
lea FIB(a5),a3 ;FIB=FileInfoBlock Struktur
move.l a3,d2
jsr _LVOExamineFH(a6) ;FileInfoBlock Struktur füllen
move.l fib_Size(a3),d0 ;Filegröße
addq #1,d0 ;+1
move.l d0,Filegroesse(a5) ;Filegröße
cmp.l #1,d0 ;Vergleiche mit 1
beq.s nixPrefs ;Prefs Leer
tst.l d0 ;=0
beq.s nixPrefs ;PrefsLeer
move.l #MEMF_PUBLIC!MEMF_CLEAR,d1 ;Speicher Type
move.l 4.w,a6 ;EXECBase
jsr _LVOAllocMem(a6) ;Reserviere Speicher
move.l d0,FileSpeicher(a5) ;File Speicher
beq.s ErrorFiSp ;kein Speicher
move.l d0,a0 ;File Speicher
move.l PrefsFileHandle(a5),d1 ;File Addr.
move.l a0,d2 ;Buffer, wo das eingelesen wird
move.l Filegroesse(a5),d3 ;wieviel Bytes
move.l DOSBase(a5),a6 ;DOS
jsr _LVORead(a6) ;File Lesen
SchliesseFile
move.l PrefsFileHandle(a5),d1 ;File Addr.
move.l DOSBase(a5),a6 ;DOS
jsr _LVOClose(a6) ;File schliessen
rts
ErrorFiSp
moveq #28,d7 ;28=kein Speicher für Prefs
bra.s SchliesseFile
OpenFileError
moveq #24,d7 ;24=konnte File BangerMenu.prefs nicht öffnen
rts
nixPrefs
moveq #27,d7 ;27=Prefs vorhanden aber leer
bra.s SchliesseFile
;;
** Library Öffnen + Schliessen
LibOeffne
move.l a5,a4 ;Intuition Vari.
lea intname(pc),a1 ;Intuition String
bsr.s OeffneLib ;Routine OpenLibrary
lea dosname(pc),a1 ;Dos String
bsr.s OeffneLib
lea gadname(pc),a1 ;Gadtools String
bsr.s OeffneLib
lea gfxname(pc),a1 ;Graphics String
bsr.s OeffneLib
rts
OeffneLib
moveq #37,d0 ;Ver. 37 (Kick 2.04)
jsr _LVOOpenLibrary(a6) ;Öffne Library
move.l d0,(a4)+ ;Addr. Speichern
beq.s LibError ;Fehler ?
rts
LibError
moveq #22,d7 ;22 = konnte Library nicht öffnen
rts
LibSchliesse
move.l 4.w,a6 ;ExecBase
moveq #4-1,d2 ;4 Libraries Schliessen
lea WindowHandle(a5),a4
SchliesseLib
move.l -(a4),a1 ;Angefangen mit GfxBase
cmp.l #0,a1 ;Addr. gleich 0
beq.s notOpened ;Ja dann Lib war nicht geöffnet
jsr _LVOCloseLibrary(a6) ;Schliesse Library
notOpened
dbra d2,SchliesseLib ;Solange bis alle 4 Libraries geschlossen
rts
;;
** PubScreenOeffne
PubScreenOeffne
tst.l MonitorKey(a5) ;MonitorTreiber
beq.w StdPal ;Nein dann PAL
tst.l MoniID(a5) ;MonitorID nr. vorhanden
bne.s IDistDa ;ja
moveq #32,d7 ;32=fehlender Parameter
rts
IDistDa
move.l MonitorKey(a5),d1 ;MonitorTreiber Name
moveq #0,d2 ;kein Input
moveq #0,d3 ;kein Output
move.l DOSBase(a5),a6 ;DOS Library Funktion
jsr _LVOExecute(a6) ;Programm Ausführen
tst.l d0 ;Programm OK ?
bne.s NeuenMonitor ;JA
moveq #34,d7 ;34=konnte MonitorTreiber Datei nicht laden
rts
NeuenMonitor
move.l MoniID(a5),a4 ;MonitorID Nr.
move.l (a4),d0
move.l GFXBase(a5),a6 ;Graphics Base Funktion
jsr _LVOFindDisplayInfo(a6) ;Finde DisplayInfoHandle zur IDNr.
tst.l d0 ;Auflösung gefunden ?
bne.s MonitorDa ;JA!
moveq #35,d7 ;35=Monitor mit angebenen ID nicht gefunden
rts
MonitorDa
move.l 4.w,a6 ;EXECBase
keinSignal
moveq #-1,d0 ;Irgenein freies Signal
jsr _LVOAllocSignal(a6) ;Besetze Signal
move.b d0,ScreenSignal(a5) ;SignalNr
bmi.b keinSignal ;kein Siganlfrei warte
lea MyScreenTags(pc),a1 ;ScreenTags
lea PubScTitle(pc),a0 ;ScreenTitel eintragen
move.l a0,4(a1)
move.l MoniID(a5),a4 ;Auflösung eintragen
move.l (a4),12(a1)
moveq #0,d0
move.b ScreenSignal(a5),d0 ;ScreenSignal eintragen
move.l d0,20(a1)
lea PenArray(pc),a0 ;PenArray Struktur eintragen
move.l a0,28(a1)
suba.l a0,a0 ;kein NewScreen Struktur
move.l INTUIBase(a5),a6 ;Intuition Base Funktion
jsr _LVOOpenScreenTagList(a6) ;Öffne neuen Screen
move.l d0,ScreenHandle(a5) ;ScreenAddr.
bne.s Pubvorgucken ;Screen OK!
moveq #36,d7 ;36=konnte Screen nicht öffnen
rts
Pubvorgucken
move.l d0,a0 ;ScreenAddr.
moveq #0,d0 ;Public Screen
jsr _LVOPubScreenStatus(a6) ;Screen Status setzen
move.w d0,d1 ;erfolgreich ?
beq.b keinPubScreen ;NEIN
lea PubScTitle(pc),a0 ;ScreenTitel
bra.s Pubgucken
StdPal
suba.l a0,a0 ;StartScreen (Workbench)
Pubgucken
move.l INTUIBase(a5),a6 ;Intuition Base Funktion
jsr _LVOLockPubScreen(a6) ;Lock Screen
tst.l d0 ;Fehler ?
beq.s keinPubScreen ;JA
move.l d0,ScreenHandle(a5) ;ScreenAddr.
move.l d0,a0
move.w sc_Height(a0),SCHoehe(a5) ;Screen Höhe
move.w sc_Width(a0),SCBreite(a5) ;Screen Breite
sub.w #20,SCBreite(a5) ;Höhe-32
sub.w #50,SCHoehe(a5) ;Breite-80
move.l sc_Font(a0),a1 ;FontAttr Struktur
move.w ta_YSize(a1),d2 ;Font Größe
add.b sc_WBorTop(a0),d2 ;+ ScreenTitleBorder Größe
addq #1,d2 ;+1
move.b d2,RelativeTopC(a5) ;Relative Ecke von Oben
move.b sc_WBorTop(a0),RelativeLeftC(a5) ;Relative Ecke von Links
suba.l a1,a1 ;keine Tags
move.l GADBase(a5),a6 ;GadTools Base Funktion
jsr _LVOGetVisualInfoA(a6) ;Besorge VisualInfo
move.l d0,VisualInfo(a5) ;VisualInfo Addr.
bne.s VisualOK ;OK!
keinPubScreen
moveq #23,d7 ;23=GetVisualInfo Fehler
VisualOK
rts
ScreenSchliesse
move.l GADBase(a5),a6 ;GadTools Base Funktion
move.l VisualInfo(a5),a0 ;VisualInfo Addr.
jsr _LVOFreeVisualInfo(a6) ;Gebe VisualInfo frei
ScrSchliesse
move.l INTUIBase(a5),a6 ;Intuition Base Funktion
suba.l a0,a0 ;kein Name
move.l ScreenHandle(a5),a1 ;Screen Struktur
jsr _LVOUnlockPubScreen(a6) ;Unlock Screen
cmp.b #10,d7 ;BangerMenu führt Batchdatei aus
beq.s ScreenBleibt
move.l ScreenHandle(a5),a0 ;ScreenAddr.
jsr _LVOCloseScreen(a6) ;Schliesse Screen
ScreenBleibt
rts
;;
** LONG Daten
SystemExeTags
dc.l SYS_Input,0
dc.l SYS_Output,0
dc.l SYS_Asynch,-1
dc.l SYS_UserShell,-1
dc.l TAG_DONE
Fenster_Tags
dc.l WA_Title,0
dc.l WA_Gadgets,0
dc.l WA_ScreenTitle,0
dc.l WA_Width,0
dc.l WA_Height,0
dc.l WA_Top,11
dc.l WA_Left,0
dc.l WA_PubScreen,0
dc.l WA_IDCMP,IDCMP_MENUPICK!IDCMP_CLOSEWINDOW!IDCMP_VANILLAKEY!IDCMP_REFRESHWINDOW!BUTTONIDCMP!RAWKEY
dc.l WA_Flags,WFLG_ACTIVATE!WFLG_SMART_REFRESH!WFLG_DRAGBAR!WFLG_DEPTHGADGET!WFLG_CLOSEGADGET
dc.l WA_NewLookMenus,-1
dc.l WA_AutoAdjust,-1
dc.l TAG_DONE
MyScreenTags
dc.l SA_PubName,0
dc.l SA_DisplayID,0
dc.l SA_PubSig,0
dc.l SA_Pens,0
dc.l SA_Type,WBENCHSCREEN
dc.l SA_Width,STDSCREENWIDTH
dc.l SA_Height,STDSCREENHEIGHT
dc.l SA_Depth,2
dc.l SA_SysFont,1
dc.l SA_Overscan,OSCAN_TEXT
dc.l TAG_DONE
UniGad
dc.w 20,20,0,10
dc.l 0,0
dc.w 0
dc.l PLACETEXT_IN,0,0
PageGads
dc.w 20,5,14,12
dc.l 0,0
dc.w 10000
dc.l PLACETEXT_IN,0,0
Page2Gads
dc.w 40,5,14,12
dc.l 0,0
dc.w 10001
dc.l PLACETEXT_IN,0,0
PaGadTags
dc.l GA_Disabled,1
PaGadTags2
dc.l GT_Underscore,'_'
dc.l TAG_DONE
MenuTags
dc.l GTMN_NewLookMenus,1
dc.l TAG_END
topaz8:
dc.l 0
dc.w 8
dc.b 0,1
PenArray
dc.w -1
EndeReq
dc.l EasyStruct_SIZEOF
dc.l 0,0,0,0
;;
** BYTE Daten
ParaTemplate dc.b 'FN=PREFSFILENAME/K,MT=MONITORTREIBER/K,MONITORID/K/N,NOKEY/S',0
intname INTNAME
dosname DOSNAME
gadname GADTOOLSNAME
gfxname GRAFNAME
AbReqTi dc.b 'About the program:',0
AbReqTxt dc.b 'BangerMenu is giftware',10
dc.b 'Autor: Andre´ Trettin',10
dc.b ' Duwockskamp 33',10
dc.b ' 21029 Hamburg',10
dc.b ' 040/7246861',10
dc.b ' Germany',10,10
dc.b ' EMail: tretti-a@rzbt.fh-hamburg.de',10
dc.b 'Homepage: demnächst',10,10
dc.b 'Greeting all how sent me a EMail about BangerMenu',10
dc.b ' and all my friends',0
AbGadTxt dc.b 'OK',0
ProjektName dc.b 'Project',0
InfoName dc.b 'About',0
QuitName dc.b 'Quit',0
InfoTaste dc.b 'A',0
QuitTaste dc.b 'Q',0
PubScTitle dc.b 'Workbench Screen',0
PageLeftTxt dc.b '_<',0
PageRightTxt dc.b '_>',0
inputname dc.b 'input.device',0
PrefsFileName dc.b 'S:'
PrefsFile1 dc.b 'BangerMenu.prefs',0
topazFName8 dc.b 'topaz.font',0
WindowTitle dc.b 'BangerMenu',0
dc.b '$VER: '
ScreenTitle dc.b 'BangerMenu 3.3 (4-Sep-96) © by Andre´ Trettin',0
AysnchOut dc.b 'CON:0/0/640/200/BangerMenu Ausgabe/auto/wait/close',0
;;